
PCI_INDEX       EQU     0CF8h
PCI_DATA        EQU     0CFCh

GLOBAL  _read_msw
GLOBAL  _lidt

GLOBAL  _mascaraPIC1
GLOBAL  _mascaraPIC2

GLOBAL  _Cli
GLOBAL  _Sti

GLOBAL  _int_08_hand
GLOBAL  _int_09_hand
GLOBAL  _int_80_hand

GLOBAL  _escribir
GLOBAL  _leer
GLOBAL	_read
GLOBAL  _leer_teclado
GLOBAL  _escribo_pic
GLOBAL	_write
GLOBAL  _scanpci

GLOBAL	_read_cr0
GLOBAL	_write_cr0
GLOBAL	_read_cr3
GLOBAL	_write_cr3

EXTERN  int_08
EXTERN  int_09
EXTERN  int_80
EXTERN	eoi_pic

SECTION .text


_read_msw:

        smsw    ax			; Obtiene la Machine Status Word
        retn

_lidt:					; Carga el IDTR

        push    ebp
        mov     ebp, esp
        push    ebx
        mov     ebx, [ss: ebp + 6] 	; ds:bx = puntero a IDTR 
	rol	ebx,16		    	
	lidt    [ds: ebx]          	; carga IDTR
        pop     ebx
        pop     ebp
        retn

_read_cr0:
		mov 	eax, cr0
		retn

_write_cr0:
		push	ebp
		mov		ebp, esp
		mov		eax, [ebp+8]
		mov 	cr0, eax
		pop 	ebp
		retn

_read_cr3:
		mov		eax, cr3
		retn

_write_cr3:
		push	ebp
		mov		ebp, esp
		mov		eax, [ebp+8]
		mov		cr3, eax
		pop		ebp
		retn

_mascaraPIC1:				; Escribe mascara del PIC 1

	push    ebp
        mov     ebp, esp
        mov     ax, [ss:ebp+8]  	; ax = mascara de 16 bits
        out	21h,al
        pop     ebp
        retn

_mascaraPIC2:				; Escribe mascara del PIC 2

	push    ebp
        mov     ebp, esp
        mov     ax, [ss:ebp+8]  	; ax = mascara de 16 bits
        out	0A1h,al
        pop     ebp
        retn


_Cli:
	cli				; limpia flag de interrupciones
	ret

_Sti:

	sti				; habilita interrupciones por flag
	ret


_int_08_hand:				; Handler de INT 8 ( Timer tick)

        push    ds
        push    es                      ; Se salvan los registros
        pusha                           ; Carga de DS y ES con el valor del selector
        mov     ax, 10h			; a utilizar.
        mov     ds, ax
        mov     es, ax                  
        call    int_08                 
        mov	al,20h			; Envio de EOI generico al PIC
	out	20h,al
	popa                            
        pop     es
        pop     ds
        iret

_int_09_hand:				; Handler de INT 9 (Teclado)

        cli
	push    ds
        push    es                  	; Se salvan los registros
        pusha                       	; Carga de DS y ES con el valor del selector
	mov     ax, 10h			; a utilizar.
        mov     ds, ax
        mov     es, ax
        call    int_09 			;llama a una funcion de kernel.c
 	call 	eoi_pic			;llama a una funcion de kernel.c
	popa
        pop     es
        pop     ds
        sti
	iret

_int_80_hand:				; Handler de INT 80 (Escritura)

	cli
	push	ds
        push	es                      ; Se salvan los registros
	pusha				; Carga de DS y ES con el valor del selector
	mov	ax, 10h			; a utilizar.        
	mov	ds, ax
        mov	es, ax

	push	edx			;pusheo la direccion de memoria de respuesta
	push	ecx			;pusheo la estructura parametros

	call	int_80

	pop	ecx			;popea el file descriptor
	pop	edx			;popea la direccion de memoria de respuesta
	popa
	pop	es
	pop	ds
	sti
	iret


_write:
	push ebp
	mov ebp, esp
        push    ds
        push    es                      ; Se salvan los registros
        pusha                           ; Carga de DS y ES con el valor del selector
        mov     ax, 10h			; a utilizar.
        mov     ds, ax
        mov     es, ax
	mov	ecx,[ebp+8]		;levanto la estructura de parametros
	mov	ebx,[ebp+12]		;levanto el offset

	INT 80h
	popa
	pop es
	pop ds
	mov esp, ebp
	pop ebp
	ret



_read:
	push ebp
	mov ebp, esp
        push    ds
        push    es                      ; Se salvan los registros
        pusha                           ; Carga de DS y ES con el valor del selector
        mov     ax, 10h			; a utilizar.
        mov     ds, ax
        mov     es, ax
	mov	ecx,[ebp+8]		;levanto la estructura parametros
	INT 80h
	popa
	pop es
	pop ds
	mov esp, ebp
	pop ebp
	ret

_leer_teclado:

	push ebp
	mov ebp, esp
	push	ds
        push	es                      ; Se salvan los registros
	pusha				; Carga de DS y ES con el valor del selector
	mov	ax, 10h			; a utilizar.        
	mov	ds, ax
        mov	es, ax
	mov eax, 0
	in al, 60h
	mov esp, ebp
	pop ebp
	ret


_escribo_pic:
	push ebp
	mov ebp, esp
        push    ds
        push    es                      ; Se salvan los registros
        pusha                           ; Carga de DS y ES con el valor del selector
        mov     ax, 10h			; a utilizar.
        mov     ds, ax
        mov     es, ax
	mov	eax,0
	mov	eax,[ebp+8]
	out	20h,al
	popa
	pop 	es
	pop 	ds
	mov	esp,ebp
	pop	ebp
	ret


_scanpci:
	push	ebp
	mov	ebp, esp
	push	ds
        push	es

	mov 	ax, 10h
	mov	ds, ax
	mov	es, ax

	mov	eax, [ebp+8]

	mov     dx, PCI_INDEX
	out     dx, eax                 ; send our request out

    	mov     dx, PCI_DATA            
	in      eax, dx                 ; read back 32bit value.
	
	pop	es
	pop	ds
	mov	esp, ebp
	pop	ebp
	ret
